clc;clear;close all;
%{
神经网络训练主程序 written by GSX.
流程：
训练参数设置（在NARXConfig.txt文件中）——
数据读取——
设置神经网络的输入输出——
在narx_explanation.m中设置输入序列和输出序列的名称——
在result文件夹中查看结果。
%}
[outputSetting,param]=BPFF_configInput('BPFFConfig.txt');  %导入训练设置

%% 数据读取
addpath('./BPFF');
load mdm.mat
date=time;    % 可视化的日期，1996年1月1日0点是262969个数据，目前试图用前三十年数据训练网络，然后预测后二十年水位并进行比较
% 1976年1月1日是87649个数据
t=t;    %日期序列数
% for i=1:length(t)
%     tempdate=datenum(date(i,1),1,1,0,0,0);
%     t(i)=t(i)-tempdate;
% end  %将t转换成基于每年第一天的相对天数时间，以去掉输入年份的影响

makou_Q=q(:);
sanzao_z=z(:,1);
denglongshan_z=z(:,2);
zhuyin_z=z(:,3);
ganzhu_z=z(:,4);
makou_z=z(:,5);
makou_z_fixed=BPFF_fix_makou_z(date,t,makou_Q,makou_z);



%% 读取导入的训练设置
outputPath=outputSetting.outputPath;  %保存预测结果输出的路径
outputName=outputSetting.outputName;
% 生成图片对应的训练参数文档说明
BPFF_explanation(outputSetting,param);
for station=1:3
    for i=1:param.trainCount
        if outputSetting.isDate==1
            param=param.date_to_index(t);  %将日期转化为索引
        end
        trainBegin=param.trainBegin{i};       %用于训练的数据的开始索引
        trainEnd=param.trainEnd{i};      %用于训练的数据的结束索引
        predictBegin=param.predictBegin{i};       %用于预测的数据的开始索引
        predictEnd=param.predictEnd{i};      %用于预测的数据的结束索引
        if trainBegin==0
            continuePredict=1;   %是否使用上一次的训练结果预测这一次输入
        else
            continuePredict=0;
        end
        % 神经网络部分设置
        hiddenLayerSize = param.hiddenLayerSize{i};    %隐藏层神经元数
        
        %% 设置神经网络的输入输出
        if continuePredict==false
            makou_Q_train=q(trainBegin:trainEnd);
            sanzao_z_train=z(trainBegin:trainEnd,1);
            denglongshan_z_train=z(trainBegin:trainEnd,2);
            zhuyin_z_train=z(trainBegin:trainEnd,3);
            ganzhu_z_train=z(trainBegin:trainEnd,4);
            makou_z_train=makou_z_fixed(trainBegin:trainEnd);
        end
        makou_Q_predict=q(predictBegin:predictEnd);
        sanzao_z_predict=z(predictBegin:predictEnd,1);
        denglongshan_z_predict=z(predictBegin:predictEnd,2);
        zhuyin_z_predict=z(predictBegin:predictEnd,3);
        ganzhu_z_predict=z(predictBegin:predictEnd,4);
        makou_z_predict=makou_z_fixed(predictBegin:predictEnd);
        
        % 输入和目标序列设置
        inputTrain=[makou_Q_train makou_z_train sanzao_z_train];   %输入的训练用时间序列
        targetTrain=makou_z_train;   %目标训练时间序列
        inputPredict=[makou_Q_predict sanzao_z_predict makou_z_predict];   %输入的预测时间序列
        targetPredict=makou_z_predict;   %目标预测时间序列
        
        %% 以上述参数训练NARX神经网络
%         output=BPFF_predict_gsx(outputSetting, i,...
%             inputTrain,targetTrain,inputPredict,targetPredict, ...
%             hiddenLayerSize,continuePredict);
%         % 绘制结果并保存
%         BPFF_plot_gsx(outputSetting,output,targetPredict,num2str(i));
        
        switch station
            case 1
                output_GZ=BPFF_predict_gsx(outputSetting,i, ...
                    inputTrain,ganzhu_z_train,inputPredict,ganzhu_z_predict, ...
                    hiddenLayerSize,continuePredict,'GZ');
                BPFF_plot_gsx(outputSetting,output_GZ,ganzhu_z(predictBegin:predictEnd),strcat('GZ',num2str(i)));
            case 2
                output_ZY=BPFF_predict_gsx(outputSetting,i, ...
                    inputTrain,zhuyin_z_train,inputPredict,zhuyin_z_predict, ...
                    hiddenLayerSize,continuePredict,'ZY');
                BPFF_plot_gsx(outputSetting,output_ZY,zhuyin_z(predictBegin:predictEnd),strcat('ZY',num2str(i)));
            case 3
                output_DLS=BPFF_predict_gsx(outputSetting,i, ...
                    inputTrain,denglongshan_z_train,inputPredict,denglongshan_z_predict, ...
                    hiddenLayerSize,continuePredict,'DLS');
                BPFF_plot_gsx(outputSetting,output_DLS,denglongshan_z(predictBegin:predictEnd),strcat('DLS',num2str(i)));
        end
        
    end
end
